package cn.iocoder.yudao.module.system.dal.mysql.exam;

import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.system.dal.dataobject.exam.ExamUserAnswerDO;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

/**
 * 用户答题记录 Mapper
 *
 * @author 芋道源码
 */
@Mapper
public interface ExamUserAnswerMapper extends BaseMapperX<ExamUserAnswerDO> {

    /**
     * 根据用户ID和测试批次号查询答题记录
     *
     * @param userId 用户ID
     * @param testBatchNo 测试批次号
     * @return 答题记录列表
     */
    default List<ExamUserAnswerDO> selectByUserIdAndBatchNo(Long userId, String testBatchNo) {
        return selectList(new LambdaQueryWrapperX<ExamUserAnswerDO>()
                .eq(ExamUserAnswerDO::getUserId, userId)
                .eq(ExamUserAnswerDO::getTestBatchNo, testBatchNo)
                .eq(ExamUserAnswerDO::getStatus, 1)
                .orderByAsc(ExamUserAnswerDO::getQuestionId, ExamUserAnswerDO::getAnswerTime));
    }

    /**
     * 根据用户ID查询答题记录
     *
     * @param userId 用户ID
     * @return 答题记录列表
     */
    default List<ExamUserAnswerDO> selectByUserId(Long userId) {
        return selectList(new LambdaQueryWrapperX<ExamUserAnswerDO>()
                .eq(ExamUserAnswerDO::getUserId, userId)
                .eq(ExamUserAnswerDO::getStatus, 1)
                .orderByDesc(ExamUserAnswerDO::getAnswerTime));
    }

    /**
     * 根据测试批次号查询答题记录
     *
     * @param testBatchNo 测试批次号
     * @return 答题记录列表
     */
    default List<ExamUserAnswerDO> selectByBatchNo(String testBatchNo) {
        return selectList(new LambdaQueryWrapperX<ExamUserAnswerDO>()
                .eq(ExamUserAnswerDO::getTestBatchNo, testBatchNo)
                .eq(ExamUserAnswerDO::getStatus, 1)
                .orderByAsc(ExamUserAnswerDO::getQuestionId, ExamUserAnswerDO::getAnswerTime));
    }

    /**
     * 根据用户ID和测试批次号删除答题记录
     *
     * @param userId 用户ID
     * @param testBatchNo 测试批次号
     * @return 删除数量
     */
    default int deleteByUserIdAndBatchNo(Long userId, String testBatchNo) {
        return delete(new LambdaQueryWrapperX<ExamUserAnswerDO>()
                .eq(ExamUserAnswerDO::getUserId, userId)
                .eq(ExamUserAnswerDO::getTestBatchNo, testBatchNo));
    }

    /**
     * 根据用户ID删除答题记录
     *
     * @param userId 用户ID
     * @return 删除数量
     */
    default int deleteByUserId(Long userId) {
        return delete(new LambdaQueryWrapperX<ExamUserAnswerDO>()
                .eq(ExamUserAnswerDO::getUserId, userId));
    }

    /**
     * 批量插入答题记录
     *
     * @param answers 答题记录列表
     * @return 插入数量
     */
    default int insertBatch(List<ExamUserAnswerDO> answers) {
        if (answers == null || answers.isEmpty()) {
            return 0;
        }
        
        // 使用MyBatis Plus的批量插入
        for (ExamUserAnswerDO answer : answers) {
            insert(answer);
        }
        return answers.size();
    }

}
